<?php
  /**
   * @author EVANDRO DE OLIVEIRA.
   * @category MODEL
   * @package MODELS.
   * @since 05/05/2012.
   * @last_update 05/05/2012.
   * @copyright 2012.
   * @version 1.0.
   *
   */
  class Application_Model_Estados extends Zend_Db_Table_Abstract{
    const IND_ATIVO = 1;
    const IND_INATIVO = 0;
    
    /**
     * Define a tabela padrão da controller
     */
    protected function _setup(){
      $this->_name = 'estados';
      parent::_setup();
    } 
    
    public function getColunas(){
      $arrResult = array();
      $arrCols = $this->fetchAll()->getTable()->_metadata;
      
      $arrResult[strtoupper($this->_name)] = $arrCols;
      return Core_Commons::onLoad($arrResult);
    }
    
    /**
     * Retorna todos os registros ativos.
     */
    public function getAtivos(){
      $strSql = $this->select()->where($this->_name . '.st_estado = ?', self::IND_ATIVO);
      
      $objResult = $this->fetchAll($strSql);
            
      return Core_Commons::onLoad($objResult);
    }
    
    /**
     * Retorna todos s registro de acordo co mo id
     */
    public function getById($intId){
      $strSql = $this->select()->where($this->_name . '.idEstado = ?', $intId);
      
      $objResult = $this->fetchRow($strSql);
                  
      return Core_Commons::onLoad($objResult);
    }
    
    public function getByCep($intCep){
      $arrColsEstado     = array(
        $this->_name . '.idEstado', 
        $this->_name . '.sgl_estado', 
        $this->_name . '.ds_estado'
      );
      $arrColsCidade     = array();
      $arrColsBairro     = array();
      $arrColsLogradouro = array();
      
      $strSql = $this->getAdapter()
                     ->select()
                     ->from($this->_name, $arrColsEstado)
                     ->join('cidades', 'cidades.idEstado = ' . $this->_name . '.idEstado', $arrColsCidade)
                     ->join('bairros', 'bairros.idCidade = cidades.idCidade', $arrColsBairro)
                     ->join('logradouros', 'logradouros.idBairro = bairros.idBairro', $arrColsLogradouro)
                     ->where('logradouros.ds_cep = ?', $intCep)
                     ->where($this->_name . '.st_estado = ?', self::IND_ATIVO);
      
      $objResult = $this->getAdapter()->fetchRow($strSql);
            
      return Core_Commons::onLoad($objResult);
    }
    
    /**
     * Retorna o resultado de acordo com o nome ou sigla. 
     * 
     * @param string  Nome do Estado
     * @param string  Sigla do Estado.
     * 
     * @return database_result
     */
    public function getByNomeESigla($strDsNome, $strDsSigla){
    	$arrAliasTable = array('e' => $this->_name);
    	$arrFromCollumns = array('idEstado', 'ds_sigla', 'ds_estado', 'ds_situacao');
    	
      $arrJoinCollumns = array('ds_pais');
      
      $strSql = $this->select()
      ->from($arrAliasTable, $arrFromCollumns)
      ->where('e.ds_situacao = ?', self::IND_ATIVO);
      
      if($strDsNome && $strDsSigla)      
        $strSql->where('e.ds_estado LIKE ?', '%' . $strDsNome . '%')->where('e.ds_sigla = ?', $strDsSigla);  
      elseif($strDsNome && !$strDsSigla)
        $strSql->where('e.ds_estado LIKE ?', '%' . $strDsNome . '%');
      elseif(!$strDsNome && $strDsSigla)  
        $strSql->where('e.ds_sigla = ?', $strDsSigla);    
      else
        $strSql->where('1 = ?', 1);
                 
      $objResult = $this->getAdapter()->fetchAll($strSql);            
      return Core_Commons::onLoad($objResult);
    }
    
    /**
     * Realiza a validação dos dados vindo do formulário
     * 
     * @return void.
     */
    public function validaForm(){
      $objValida = new Core_ValidaFormulario();
      $arrFilters = array('*'  =>  'StringTrim');
      $arrOptions = array('allowEmpty' =>  true);
      
      $arrValidators = array(
        'Sigla'           =>  array('allowEmpty'  => false, 'fields' => 'ds_sigla'),
        'Estado'          =>  array('allowEmpty'  => false, 'fields' => 'ds_estado'),
        'Situação'        =>  array('allowEmpty'  => false, 'fields' => 'ds_situacao'),
      );
      
      return $objValida->validaFormulario($arrFilters, $arrValidators, $arrOptions);;
    }
    
    /**
     * Salva um registro. Funcionalidade para inserção e atualização
     * @param integer Id do registro. Se for diferente de null, então será atualizado o regsitro
     * a partir do id, senão será inserido um novo registro.
     * 
     * @return boolean.
     */
    public function salvar($intId = null){
      $objValida = new Core_ValidaFormulario();
      $objDadosInput = $this->validaForm();
                              
      $arrDados['ds_sigla']       = strtoupper($objDadosInput->ds_sigla);
      $arrDados['ds_estado']      = ucfirst($objDadosInput->ds_estado);
      $arrDados['ds_situacao']    = $objDadosInput->ds_situacao;
      
      if(!$objValida->validAlpha($objDadosInput->ds_sigla))
        throw new Exception('A sigla deve conter apenas letras!', '3');
      elseif(strlen($objDadosInput->ds_sigla) != 2)
        throw new Exception('A sigla deve conter 2 letras!', '3');
      else{
        if($intId == null){
          $arrDados['dt_insercao']    = date('Y-m-d H:i:s');
          $arrDados['dt_atualizacao'] = 'NULL';
          
          $strSql = $this->select()
          ->where("ds_sigla = '" . $objDadosInput->ds_sigla . "' OR ds_estado = '" . $objDadosInput->ds_estado . "'");

          if($this->fetchAll($strSql)->current())
            throw new Exception('Estado já cadastrado com a sigla "' . $objDadosInput->ds_sigla . '" ou com o nome "' . $objDadosInput->ds_estado . '"!', '3');
          else
            return $this->insert($arrDados);
        }
        else{ 
          $arrDados['dt_atualizacao'] = date('Y-m-d H:i:s');
      
          return $this->update($arrDados, 'idEstado = ' . $intId);
        }
      }
    }
    
    /**
     * Exclui um registro  a partir do banco de dados.
     * Um registro nunca será ecluido do banco de dados.
     * Considera-se excluído um registro com status igual a "0".
     * 
     * @param integer  id para a clausula where.
     * @return boolean.
     */
    public function excluir($intId){
      $boolReturn = false;
      $objDadosInput = $this->validaForm();
      
      $strWhere = "idEstado = '" . $intId . "'";
      $arrDados['ds_situacao'] = self::IND_INATIVO; 
      $arrDados['dt_atualizacao'] = date('Y-m-d H:i:s');
      
//Zend_Debug::dump($intId);
//die;
      
      if($this->update($arrDados, $strWhere))  
        $boolReturn = true;
      
      return $boolReturn; 
      
    }
    
    
    public function teste(){
      $sql = $this->getAdapter()->select()->from('teste')->join('teste2', 'teste.id = teste2.id');
      
    }
  }